function [data_filt,err]=wavelet_filter_moregeneral(x,y,data,type,dim,limdeb,limfin)


% --------------------------------------------------------------
% Fonction basee sur l'analyse en ondelettes
% d'apres: C. Torrence (January 1998)
% (See "http://paos.colorado.edu/research/wavelets/")
% 
% adaptee pour le filtrage 1D de matrices a deux dimensions
% (ou de donnees formattees et localisees de type lon,lat,data)
%
% 
% INPUT: x: coordonnees x
%         
%        y: coordonnees y
%      
%        data: donnees (Attention, il ne doit pas y avoir de 
%              donnees manquantes !!!)
%
%        type: format des donnees - 1 si data est une matrice 2D
%                                   2 si data est un vecteur
%
%        dim: Choix de la dimension d'analyse
%                 1 - analyse pour chaque y selon les x
%                     
%                 2 - analyse pour chaque x selon les y
%
%        limdeb: Borne inferieure pour la reconstruction 
%                (en unites physiques - identiques a x ou y suivant
%                dim)
%
%        limfin: Borne sup�rieure pour la reconstruction
%                (en unites physiques - identiques a x ou y suivant
%                dim)
%
% OUTPUT: data_filt: donnees filtrees
%      
%
% Programmes necessaires au filtrage: wavelet_filter.m
%                                     wavetest.m
%                                     wavelet.m
%                                     wave_signif.m
%                                     wave_bases.m
%                                     chisquare_inv.m
%                                     chisquare_solve.m
% 
%
% Remarque: Notations basees sur une analyse spatiale mais l'analyse 
% peut etre temporelle.
%
% G. Charria (Mai 2006)
% --------------------------------------------------------------

%init_time=clock;
disp(' ---- Debut du filtrage ---- ')


% ---- Permutation eventuelle si x et y sont des matrices
%if (type == 1)
%  if (size(x,1) > 1)
%    if ((size(x,1)==size(data,2))&(size(x,2)==size(data,1)))
%      x=x';
%    end
%  end
%  
%  if (size(y,1) > 2)
%    if ((size(y,1)==size(data,2))&(size(y,2)==size(data,1)))
%      y=y';
%    end
%  end  
%end
 


% ---- Filtrage en ondelettes

pad = 1;      % pad the time series with zeroes (recommended)
dj = 0.25;    % this will do 4 sub-octaves per octave
j1 = 9/dj;    % this says do 7 powers-of-two with dj sub-octaves each
lag1 = 0.72;  % lag-1 autocorrelation for red noise background
mother = 'Morlet';

if (type==1) % Matrice 2D pour data
  if (dim == 1) % Analyse pour chaque latitude
    
    data_filt(1:size(data,1),1:size(data,2))=NaN;
    err(1:size(data,1),1:size(data,2))=NaN;
    for ilat=1:size(data,2)

      % ---- Verification de valeurs presentes a cette latitude
      index=find(isnan(squeeze(data(ilat,:)))==0);      
      if (isempty(index)==0)
      
	
	if (size(x,1) > 1)
	  dt=mean(diff(squeeze(x(:,ilat))));
	  t0=x(1,ilat);
	else
	  dt=mean(diff(squeeze(x)));
	  t0=x(1);
	end
      
	
	
	% ---- Calcul des bornes de reconstruction a partir des
	% valeurs en km dans le cas de l'analyse spatiale
	% Soit calcul de jdeb et jfin a partir de limdeb et limfin.
	s0 = 2*dt; 
	jdeb=round(((log(limdeb/s0))/(dj*log(2.)))+1);
	jfin=round(((log(limfin/s0))/(dj*log(2.)))+1);
    if jfin > j1
        jfin=j1;
    end
    
	
	  

	
	
	
      
	% ---- Filtrage par analyse en ondelettes
	[data_filt(ilat,:),err(ilat,:)]=wavetest_filter(dt,t0,pad,dj,j1,jdeb,jfin,lag1,mother,squeeze(data(ilat,:)));
      
      else
	err(ilat,:)=NaN;
	data_filt(ilat,:)=NaN;
      end     
    end
  elseif (dim == 2) % Analyse pour chaque longitude
    
    for ilon=1:size(data,1)
      
      
    end    
  end
elseif (type == 2) % Vecteurs x,y,data
  
  
  
  
end



      
      
% ---- Verification de la reconstruction

%disp(['Temps d''execution:',num2str(etime(clock,init_time)/60),' min'])
disp(' ---- Fin du filtrage ---- ')
